package com.ungs.reportes.impl;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.ungs.bo.OrdenTrabajoBO;
import com.ungs.bo.impl.OrdenTrabajoBOImpl;
import com.ungs.entities.Material;
import com.ungs.entities.OrdenTrabajo;
import com.ungs.entities.ProcesoXOrden;
import com.ungs.utils.ArchivosIO;
import com.ungs.utils.Constantes;
import com.ungs.utils.Fechas;

public class ReportOrdenTrabajo {
	private OrdenTrabajo ordenTrabajo;
	private List<Material> materialList;
	private List<ProcesoXOrden> procesoXOrdenList;
	private PdfPTable tablaMateriales;
	private PdfPTable tablaProcesos;
	private Document documento;
	private static int letraCelda = 7;

	public ReportOrdenTrabajo(OrdenTrabajo ordenTrabajo) {
		this.ordenTrabajo = ordenTrabajo;
	}

	@SuppressWarnings("static-access")
	public void generarPDFFileChooser(boolean imprimir) throws Exception {
		ArchivosIO archivosIO = new ArchivosIO();
		OrdenTrabajoBO ordenTrabajoBO = new OrdenTrabajoBOImpl();
		materialList = ordenTrabajoBO.getMaterialesByOrdenTrabajo(ordenTrabajo);
		procesoXOrdenList = ordenTrabajoBO
				.getProcesosXOrdenByOrdenTrabajo(ordenTrabajo);

		try {
			FileNameExtensionFilter filter = new FileNameExtensionFilter(
					Constantes.ARCHIVO_PDF, Constantes.EXTENSION_PDF);
			String rutaCompleta = "";
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.setFileFilter(filter);
			fileChooser.setDialogTitle(Constantes.CARGAR_ARCHIVO);
			fileChooser.setVisible(true);

			int result = fileChooser.showSaveDialog(null);

			if (result == fileChooser.APPROVE_OPTION) {
				rutaCompleta = fileChooser.getSelectedFile().getAbsolutePath();

				rutaCompleta = rutaCompleta + "OT"
						+ ordenTrabajo.getNumIdentificatorio() + "."
						+ Constantes.EXTENSION_PDF;
				/* Tabla procesos */
				tablaProcesos = new PdfPTable(8);
				tablaProcesos.setWidthPercentage(100);
				tituloTablaProcesos();
				completarTablaProcesos();

				/* Tabla materiales */
				tablaMateriales = new PdfPTable(10);
				tablaMateriales.setWidthPercentage(100);
				tituloTablaMaterial();
				completarTablaMaterial();

				documento = new Document(PageSize.A4);

				PdfWriter.getInstance(documento, new FileOutputStream(
						rutaCompleta));

				documento.open();

				encabezadoOrdenTrabajo();

				documento.add(escribirLinea("PROCESOS"));
				documento.add(tablaProcesos);
				documento.add(nuevaLinea());
				if (ordenTrabajo.getEstado().equals(
						Constantes.ESTADO_FINALIZADO)
						|| ordenTrabajo.getEstado().equals(
								Constantes.ESTADO_FINALIZADO_SC)) {
					tablaProcesosOTFinalizada();
					documento.add(nuevaLinea());
				}
				documento.add(nuevaLinea());
				documento.add(escribirLinea("MATERIALES"));
				documento.add(tablaMateriales);

				/* Cerramos el documento */
				documento.close();

				if (imprimir) {
					archivosIO.imprimirArchivo(rutaCompleta);
				} else {
					archivosIO.verArchivo(rutaCompleta);
				}
			}
		} catch (DocumentException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
					JOptionPane.ERROR_MESSAGE);
			return;
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
	}

	public void generar() throws Exception {
		/* Estructurar */
		try {
			/* Tabla procesos */
			tablaProcesos = new PdfPTable(8);
			tablaProcesos.setWidthPercentage(100);
			tituloTablaProcesos();
			completarTablaProcesos();

			/* Tabla materiales */
			tablaMateriales = new PdfPTable(10);
			tablaMateriales.setWidthPercentage(100);
			tituloTablaMaterial();
			completarTablaMaterial();

			documento = new Document(PageSize.A4);

			/* Definimos el nombre del archivo de salida con extension PDF */
			String file = "Hola.pdf";

			PdfWriter.getInstance(documento, new FileOutputStream(file));

			documento.open();

			encabezadoOrdenTrabajo();

			documento.add(escribirLinea("PROCESOS"));
			documento.add(tablaProcesos);
			documento.add(nuevaLinea());
			documento.add(nuevaLinea());
			documento.add(escribirLinea("MATERIALES"));
			documento.add(tablaMateriales);

			/* Cerramos el documento */
			documento.close();

			ArchivosIO archivosIO = new ArchivosIO();
			archivosIO.verArchivo(file);

		} catch (DocumentException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
					JOptionPane.ERROR_MESSAGE);
			return;
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Error",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
	}

	private void encabezadoOrdenTrabajo() throws Exception {
		/* Titulo */
		String encabezado = "\n\n\n            Orden de Trabajo\n\n";
		Font fuenteTitulo = new Font(Font.getFamily("ARIAL"), 14, Font.BOLD);
		Date fecha = new Date();
		Image imagen = Image.getInstance((Constantes.LOGO_CHICO));
		imagen.setAlignment(Image.LEFT | Image.TEXTWRAP);

		Paragraph linea = new Paragraph(encabezado, fuenteTitulo);
		Paragraph fechaParagraph = new Paragraph("Fecha: "
				+ Fechas.getFechaString(fecha));
		fechaParagraph.setAlignment(Element.ALIGN_RIGHT);

		documento.add(imagen);
		documento.add(fechaParagraph);
		documento.add(linea);

		/* Linea 1 */
		String numeroOT = "Numero:         "
				+ ordenTrabajo.getNumIdentificatorio();
		numeroOT = blancos(numeroOT, 50);
		String nombreCorto = "Nombre corto: " + ordenTrabajo.getNombreCorto();
		nombreCorto = blancos(nombreCorto, 45);
		String estadoOT = "Estado: " + ordenTrabajo.getEstado() + "\n";
		Font fuente = new Font(Font.getFamily("ARIAL"), 10);
		Paragraph linea1 = new Paragraph(numeroOT + nombreCorto + estadoOT,
				fuente);
		documento.add(linea1);

		/* Linea 2 */
		String descripcion = "Descripcion:   " + ordenTrabajo.getDescripcion();
		descripcion = blancos(descripcion, 100);
		String cliente = "Cliente: ";
		if (ordenTrabajo.getCliente() != null) {
			cliente = cliente + ordenTrabajo.getCliente().getRazonSocial();
		}
		cliente = cliente + "\n\n";

		Paragraph linea2 = new Paragraph(descripcion + cliente, fuente);
		documento.add(linea2);

		tablaFechas();
		tablaProducto();

		if (ordenTrabajo.getEstado().equals(Constantes.ESTADO_FINALIZADO)
				|| ordenTrabajo.getEstado().equals(
						Constantes.ESTADO_FINALIZADO_SC)) {
			String tiempoTotal = "";
			if (ordenTrabajo.getFechaComienzo() != null
					&& ordenTrabajo.getFechaCierre() != null) {
				tiempoTotal = Fechas.calcularTiempo(
						ordenTrabajo.getFechaComienzo(),
						ordenTrabajo.getFechaCierre());
			}
			documento.add(nuevaLinea());
			documento.add(escribirLinea("Tiempo Total: " + tiempoTotal));
			documento.add(nuevaLinea());
		}

	}

	private void tituloTablaProcesos() throws DocumentException {
		float[] columnWidths = { 0.5f, 1.5f, 0.5f, 1.4f, 2f, 1f, 0.8f, 0.8f };
		tablaProcesos.setWidths(columnWidths);
		/* Definimos las celdas que seran los encabezados de la tabla */
		PdfPCell celdaOrden = new PdfPCell(new Paragraph("Orden",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaOrden.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaProceso = new PdfPCell(new Paragraph("Proceso",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaProceso.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaTercerizado = new PdfPCell(new Paragraph("Terc.",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaTercerizado.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaProveedor = new PdfPCell(new Paragraph("Proveedor",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaProveedor.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaObservacion = new PdfPCell(new Paragraph("Observacion",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaObservacion.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaEstado = new PdfPCell(new Paragraph("Estado",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaEstado.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaFechaComienzo = new PdfPCell(new Paragraph(
				"Fecha Comienzo", FontFactory.getFont("arial", 8, Font.BOLD,
						BaseColor.RED)));
		celdaFechaComienzo.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaFechaCierre = new PdfPCell(new Paragraph("Fecha Cierre",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaFechaCierre.setBackgroundColor(BaseColor.LIGHT_GRAY);

		tablaProcesos.addCell(celdaOrden);
		tablaProcesos.addCell(celdaProceso);
		tablaProcesos.addCell(celdaTercerizado);
		tablaProcesos.addCell(celdaProveedor);
		tablaProcesos.addCell(celdaObservacion);
		tablaProcesos.addCell(celdaEstado);
		tablaProcesos.addCell(celdaFechaComienzo);
		tablaProcesos.addCell(celdaFechaCierre);
	}

	private void tituloTablaMaterial() throws DocumentException {
		float[] columnWidths = { 1.4f, 0.8f, 2.4f, 1.6f, 0.8f, 0.8f, 0.8f,
				0.8f, 0.8f, 0.8f };
		tablaMateriales.setWidths(columnWidths);
		/* Definimos las celdas que seran los encabezados de la tabla */
		PdfPCell celdaElemento = new PdfPCell(new Paragraph("Elemento",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaElemento.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaCantidad = new PdfPCell(new Paragraph("Cant",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaCantidad.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaCalidad = new PdfPCell(new Paragraph("Calidad",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaCalidad.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaVariante = new PdfPCell(new Paragraph("Variante",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaVariante.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaFormatoPapel = new PdfPCell(new Paragraph(
				"Formato Papel", FontFactory.getFont("arial", 8, Font.BOLD,
						BaseColor.RED)));
		celdaFormatoPapel.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaGramaje = new PdfPCell(new Paragraph("Gramaje",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaGramaje.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaPosesXPliego = new PdfPCell(new Paragraph(
				"Poses x pliego", FontFactory.getFont("arial", 8, Font.BOLD,
						BaseColor.RED)));
		celdaPosesXPliego.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaPliegosNetos = new PdfPCell(new Paragraph(
				"Pliegos Netos", FontFactory.getFont("arial", 8, Font.BOLD,
						BaseColor.RED)));
		celdaPliegosNetos.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaPliegosEnDemasia = new PdfPCell(new Paragraph(
				"Pliegos Demasia", FontFactory.getFont("arial", 8, Font.BOLD,
						BaseColor.RED)));
		celdaPliegosEnDemasia.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaCantidadHojas = new PdfPCell(new Paragraph("Cant Hojas",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaCantidadHojas.setBackgroundColor(BaseColor.LIGHT_GRAY);

		tablaMateriales.addCell(celdaElemento);
		tablaMateriales.addCell(celdaCantidad);
		tablaMateriales.addCell(celdaCalidad);
		tablaMateriales.addCell(celdaVariante);
		tablaMateriales.addCell(celdaFormatoPapel);
		tablaMateriales.addCell(celdaGramaje);
		tablaMateriales.addCell(celdaPosesXPliego);
		tablaMateriales.addCell(celdaPliegosNetos);
		tablaMateriales.addCell(celdaPliegosEnDemasia);
		tablaMateriales.addCell(celdaCantidadHojas);
	}

	private void completarTablaMaterial() {
		for (Material material : materialList) {
			/* Elemento */
			PdfPCell celdaElementoImpl = new PdfPCell(new Paragraph(
					material.getElemento(), FontFactory.getFont("arial",
							letraCelda)));
			tablaMateriales.addCell(celdaElementoImpl);

			/* Cantidad */
			PdfPCell celdaCantidadImpl = new PdfPCell(new Paragraph(
					String.valueOf(material.getCantidad()),
					FontFactory.getFont("arial", letraCelda)));
			celdaCantidadImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaCantidadImpl);

			/* Calidad */
			PdfPCell celdaCalidadImpl = new PdfPCell(new Paragraph(material
					.getCalidad().getDescripcion(), FontFactory.getFont(
					"arial", letraCelda)));
			tablaMateriales.addCell(celdaCalidadImpl);

			/* Variante */
			PdfPCell celdaVarianteImpl = new PdfPCell(new Paragraph(material
					.getVariante().getDescripcion(), FontFactory.getFont(
					"arial", letraCelda)));
			tablaMateriales.addCell(celdaVarianteImpl);

			/* Formato Papel */
			PdfPCell celdaFormatoPapelImpl = new PdfPCell(new Paragraph(
					material.getFormatoPapel().getFormatoPapel(),
					FontFactory.getFont("arial", letraCelda)));
			celdaFormatoPapelImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaFormatoPapelImpl);

			/* Gramaje */
			PdfPCell celdaGramajeImpl = new PdfPCell(new Paragraph(
					String.valueOf(material.getGramaje()) + " gr/m2",
					FontFactory.getFont("arial", letraCelda)));
			celdaGramajeImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaGramajeImpl);

			/* Poses x Pliego */
			PdfPCell celdaPosesXPliegoImpl = new PdfPCell(new Paragraph(
					String.valueOf(material.getPosesXPliego()),
					FontFactory.getFont("arial", letraCelda)));
			celdaPosesXPliegoImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaPosesXPliegoImpl);

			/* Pliegos Netos */
			PdfPCell celdaPliegosNetosImpl = new PdfPCell(new Paragraph(
					String.valueOf(material.getPliegosNetos()),
					FontFactory.getFont("arial", letraCelda)));
			celdaPliegosNetosImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaPliegosNetosImpl);

			/* Pliegos en Demasia */
			PdfPCell celdaPliegosEnDemasiaImpl = new PdfPCell(new Paragraph(
					String.valueOf(material.getPliegosEnDemasia()),
					FontFactory.getFont("arial", letraCelda)));
			celdaPliegosEnDemasiaImpl
					.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaPliegosEnDemasiaImpl);

			/* Cantidad Hojas */
			PdfPCell celdaCantidadHojasImpl = new PdfPCell(new Paragraph(
					String.valueOf(material.getCantHojas()),
					FontFactory.getFont("arial", letraCelda)));
			celdaCantidadHojasImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaMateriales.addCell(celdaCantidadHojasImpl);

		}
	}

	private void completarTablaProcesos() {
		for (ProcesoXOrden procesoXOrden : procesoXOrdenList) {
			/* Orden */
			PdfPCell celdaOrdenImpl = new PdfPCell(new Paragraph(
					String.valueOf(procesoXOrden.getOrdenProceso()),
					FontFactory.getFont("arial", letraCelda)));
			celdaOrdenImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaProcesos.addCell(celdaOrdenImpl);

			/* Proceso */
			PdfPCell celdaProcesoImpl = new PdfPCell(new Paragraph(
					procesoXOrden.getProceso().getDescripcion(),
					FontFactory.getFont("arial", letraCelda)));
			tablaProcesos.addCell(celdaProcesoImpl);

			/* Tercerizado */
			String tercerizado = "NO";
			if (procesoXOrden.isTercearizado()) {
				tercerizado = "SI";
			}
			PdfPCell celdaTercerizadoImpl = new PdfPCell(new Paragraph(
					tercerizado, FontFactory.getFont("arial", letraCelda)));
			celdaTercerizadoImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaProcesos.addCell(celdaTercerizadoImpl);

			/* Proveedor */
			String proveedor = "";
			if (procesoXOrden.getProveedor() != null) {
				proveedor = procesoXOrden.getProveedor().getRazonSocial();
			}
			PdfPCell celdaProveedorImpl = new PdfPCell(new Paragraph(proveedor,
					FontFactory.getFont("arial", letraCelda)));
			tablaProcesos.addCell(celdaProveedorImpl);

			/* Observacion */
			PdfPCell celdaObservacionImpl = new PdfPCell(new Paragraph(
					procesoXOrden.getObservacion(), FontFactory.getFont(
							"arial", letraCelda)));
			tablaProcesos.addCell(celdaObservacionImpl);

			/* Estado */
			PdfPCell celdaEstadoImpl = new PdfPCell(new Paragraph(
					procesoXOrden.getEstado(), FontFactory.getFont("arial",
							letraCelda)));
			tablaProcesos.addCell(celdaEstadoImpl);

			/* Fecha comienzo */
			String fechaComienzo = "";
			if (procesoXOrden.getFechaComienzo() != null) {
				fechaComienzo = Fechas.getFechaString(procesoXOrden
						.getFechaComienzo());
			}
			PdfPCell celdaFechaComienzoImpl = new PdfPCell(new Paragraph(
					fechaComienzo, FontFactory.getFont("arial", letraCelda)));
			celdaFechaComienzoImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaProcesos.addCell(celdaFechaComienzoImpl);

			/* Fecha cierre */
			String fechaCierre = "";
			if (procesoXOrden.getFechaCierre() != null) {
				fechaCierre = Fechas.getFechaString(procesoXOrden
						.getFechaCierre());
			}
			PdfPCell celdaFechaCierreImpl = new PdfPCell(new Paragraph(
					fechaCierre, FontFactory.getFont("arial", letraCelda)));
			celdaFechaCierreImpl.setHorizontalAlignment(Element.ALIGN_CENTER);
			tablaProcesos.addCell(celdaFechaCierreImpl);

		}
	}

	private void tablaFechas() throws DocumentException {
		/* Fechas */
		PdfPTable tablaFechas = new PdfPTable(4);
		tablaFechas.setWidthPercentage(70);
		tablaFechas.setHorizontalAlignment(Element.ALIGN_LEFT);
		PdfPCell celdaFechaConfeccion = new PdfPCell(new Paragraph(
				"Fecha Confeccion", FontFactory.getFont("arial", 10)));
		celdaFechaConfeccion.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaFechaPrometida = new PdfPCell(new Paragraph(
				"Fecha Prometida", FontFactory.getFont("arial", 10)));
		celdaFechaPrometida.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaFechaComienzo = new PdfPCell(new Paragraph(
				"Fecha Comienzo", FontFactory.getFont("arial", 10)));
		celdaFechaComienzo.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaFechaCierre = new PdfPCell(new Paragraph("Fecha Cierre",
				FontFactory.getFont("arial", 10)));
		celdaFechaCierre.setBorderColor(BaseColor.WHITE);

		tablaFechas.addCell(celdaFechaConfeccion);
		tablaFechas.addCell(celdaFechaPrometida);
		tablaFechas.addCell(celdaFechaComienzo);
		tablaFechas.addCell(celdaFechaCierre);

		String fechaConfeccion = "";
		if (ordenTrabajo.getFechaConfeccion() != null) {
			fechaConfeccion = Fechas.getFechaString(ordenTrabajo
					.getFechaConfeccion());
		}
		String fechaPrometida = "";
		if (ordenTrabajo.getFechaPrometida() != null) {
			fechaPrometida = Fechas.getFechaString(ordenTrabajo
					.getFechaPrometida());
		}
		String fechaComienzo = "";
		if (ordenTrabajo.getFechaComienzo() != null) {
			fechaComienzo = Fechas.getFechaString(ordenTrabajo
					.getFechaComienzo());
		}
		String fechaCierre = "";
		if (ordenTrabajo.getFechaCierre() != null) {
			fechaCierre = Fechas.getFechaString(ordenTrabajo.getFechaCierre());
		}

		PdfPCell celdaFechaConfeccionImpl = new PdfPCell(new Paragraph(
				fechaConfeccion, FontFactory.getFont("arial", 10)));
		celdaFechaConfeccionImpl.setBorderColor(BaseColor.WHITE);
		tablaFechas.addCell(celdaFechaConfeccionImpl);

		PdfPCell celdaFechaPrometidaImpl = new PdfPCell(new Paragraph(
				fechaPrometida, FontFactory.getFont("arial", 10)));
		celdaFechaPrometidaImpl.setBorderColor(BaseColor.WHITE);
		tablaFechas.addCell(celdaFechaPrometidaImpl);

		PdfPCell celdaFechaComienzoImpl = new PdfPCell(new Paragraph(
				fechaComienzo, FontFactory.getFont("arial", 10)));
		celdaFechaComienzoImpl.setBorderColor(BaseColor.WHITE);
		tablaFechas.addCell(celdaFechaComienzoImpl);

		PdfPCell celdaFechaCierreImpl = new PdfPCell(new Paragraph(fechaCierre,
				FontFactory.getFont("arial", 10)));
		celdaFechaCierreImpl.setBorderColor(BaseColor.WHITE);
		tablaFechas.addCell(celdaFechaCierreImpl);

		documento.add(tablaFechas);
		documento.add(nuevaLinea());
	}

	private void tablaProducto() throws DocumentException {

		/* Producto */
		PdfPTable tablaProducto = new PdfPTable(5);
		tablaProducto.setWidthPercentage(70);
		tablaProducto.setHorizontalAlignment(Element.ALIGN_LEFT);
		float[] columnWidths = { 1.5f, 0.8f, 0.8f, 0.8f, 0.8f };
		tablaProducto.setWidths(columnWidths);

		PdfPCell celdaProducto = new PdfPCell(new Paragraph("Producto",
				FontFactory.getFont("arial", 10)));
		celdaProducto.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaProductoCantidad = new PdfPCell(new Paragraph("Cantidad",
				FontFactory.getFont("arial", 10)));
		celdaProductoCantidad.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaProductoAlto = new PdfPCell(new Paragraph("Alto",
				FontFactory.getFont("arial", 10)));
		celdaProductoAlto.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaProductoAncho = new PdfPCell(new Paragraph("Ancho",
				FontFactory.getFont("arial", 10)));
		celdaProductoAncho.setBorderColor(BaseColor.WHITE);

		PdfPCell celdaProductoApaisado = new PdfPCell(new Paragraph("Apaisado",
				FontFactory.getFont("arial", 10)));
		celdaProductoApaisado.setBorderColor(BaseColor.WHITE);

		tablaProducto.addCell(celdaProducto);
		tablaProducto.addCell(celdaProductoCantidad);
		tablaProducto.addCell(celdaProductoAlto);
		tablaProducto.addCell(celdaProductoAncho);
		tablaProducto.addCell(celdaProductoApaisado);

		String producto = "";
		if (ordenTrabajo.getProducto() != null) {
			producto = String.valueOf(ordenTrabajo.getProducto());
		}

		String productoCantidad = "";
		productoCantidad = String.valueOf(ordenTrabajo.getCantidadAEntregar());

		String productoAlto = "";
		productoAlto = String.valueOf(ordenTrabajo.getAltoProducto());

		String productoAncho = "";
		productoAncho = String.valueOf(ordenTrabajo.getAnchoProducto());

		String apaisado = "NO";
		if (ordenTrabajo.isApaisado()) {
			apaisado = "SI";
		}

		PdfPCell celdaProductoImpl = new PdfPCell(new Paragraph(producto,
				FontFactory.getFont("arial", 10)));
		celdaProductoImpl.setBorderColor(BaseColor.WHITE);
		tablaProducto.addCell(celdaProductoImpl);

		PdfPCell celdaProductoCantidadImpl = new PdfPCell(new Paragraph(
				productoCantidad, FontFactory.getFont("arial", 10)));
		celdaProductoCantidadImpl.setBorderColor(BaseColor.WHITE);
		tablaProducto.addCell(celdaProductoCantidadImpl);

		PdfPCell celdaProductoAltoImpl = new PdfPCell(new Paragraph(
				productoAlto, FontFactory.getFont("arial", 10)));
		celdaProductoAltoImpl.setBorderColor(BaseColor.WHITE);
		tablaProducto.addCell(celdaProductoAltoImpl);

		PdfPCell celdaProductoAnchoImpl = new PdfPCell(new Paragraph(
				productoAncho, FontFactory.getFont("arial", 10)));
		celdaProductoAnchoImpl.setBorderColor(BaseColor.WHITE);
		tablaProducto.addCell(celdaProductoAnchoImpl);

		PdfPCell celdaProductoApaisadoImpl = new PdfPCell(new Paragraph(
				apaisado, FontFactory.getFont("arial", 10)));
		celdaProductoApaisadoImpl.setBorderColor(BaseColor.WHITE);
		tablaProducto.addCell(celdaProductoApaisadoImpl);

		documento.add(tablaProducto);
		documento.add(nuevaLinea());
	}

	private void tablaProcesosOTFinalizada() throws DocumentException {
		PdfPTable tablaProductoFinalizado = new PdfPTable(2);
		tablaProductoFinalizado.setWidthPercentage(70);
		tablaProductoFinalizado.setHorizontalAlignment(Element.ALIGN_LEFT);
		float[] columnWidths = { 1.5f, 0.5f };
		tablaProductoFinalizado.setWidths(columnWidths);

		/* Definimos las celdas que seran los encabezados de la tabla */
		PdfPCell celdaProceso = new PdfPCell(new Paragraph("Proceso",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaProceso.setBackgroundColor(BaseColor.LIGHT_GRAY);

		PdfPCell celdaTiempo = new PdfPCell(new Paragraph("Tiempo",
				FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.RED)));
		celdaTiempo.setBackgroundColor(BaseColor.LIGHT_GRAY);

		tablaProductoFinalizado.addCell(celdaProceso);
		tablaProductoFinalizado.addCell(celdaTiempo);

		for (ProcesoXOrden procesoXOrden : procesoXOrdenList) {
			/* Proceso */
			PdfPCell celdaProcesoImpl = new PdfPCell(new Paragraph(
					procesoXOrden.getProceso().getDescripcion(),
					FontFactory.getFont("arial", letraCelda)));
			tablaProductoFinalizado.addCell(celdaProcesoImpl);

			/* Tiempo */
			String tiempoProceso = "";
			if (procesoXOrden.getFechaComienzo() != null
					&& procesoXOrden.getFechaCierre() != null) {
				tiempoProceso = Fechas.calcularTiempo(
						procesoXOrden.getFechaComienzo(),
						procesoXOrden.getFechaCierre());
			}
			PdfPCell celdaTiempoImpl = new PdfPCell(new Paragraph(
					tiempoProceso, FontFactory.getFont("arial", letraCelda)));
			tablaProductoFinalizado.addCell(celdaTiempoImpl);

		}

		documento.add(tablaProductoFinalizado);

	}

	private String blancos(String param, int cant) {
		String blancos = param;
		int largo = blancos.length();
		for (int i = largo; i < cant; i++) {
			blancos = blancos + " ";
		}
		return blancos;
	}

	private Paragraph nuevaLinea() {
		Paragraph nuevaLinea = new Paragraph("\n");
		return nuevaLinea;
	}

	private Paragraph escribirLinea(String param) {
		Paragraph nuevaLinea = new Paragraph(param);
		return nuevaLinea;
	}
}
